// Hydro submission #[email protected]
// 2022.07.26
#include<bits/stdc++.h>
using namespace std;
int n,q,f[300001];
struct Edge{
int to,nxt;
}edge[600001];
int cntEdge,head[300001];
inline void addEdge(int u,int v){
edge[++cntEdge]={v,head[u]},head[u]=cntEdge;
}
int siz[300001],g[300001];
void dp(int id){
siz[id]=1;
for(int i=head[id];i;i=edge[i].nxt)
if(edge[i].to!=f[id]){
dp(edge[i].to);
siz[id]+=siz[edge[i].to];
}
int maxn=0;
for(int i=head[id];i;i=edge[i].nxt)
if(edge[i].to!=f[id]){
int v=edge[i].to;
if((siz[v]<<1)>=siz[id]&&siz[v]>maxn){
maxn=siz[v];
g[id]=g[v];
while(g[id]!=id){
if((siz[g[id]]<<1)>=siz[id])break;
g[id]=f[g[id]];
}
}
}
if(!maxn)g[id]=id;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=2;i<=n;i++){
scanf("%d",f+i);
addEdge(i,f[i]);
addEdge(f[i],i);
}
dp(1);
while(q--){
int u; scanf("%d",&u);
printf("%d\n",g[u]);
}
return 0;
}
1302. Deepest Leaves Sum | 1209. Remove All Adjacent Duplicates in String II |
994. Rotting Oranges | 983. Minimum Cost For Tickets |
973. K Closest Points to Origin | 969. Pancake Sorting |
967. Numbers With Same Consecutive Differences | 957. Prison Cells After N Days |
946. Validate Stack Sequences | 921. Minimum Add to Make Parentheses Valid |
881. Boats to Save People | 497. Random Point in Non-overlapping Rectangles |
528. Random Pick with Weight | 470. Implement Rand10() Using Rand7() |
866. Prime Palindrome | 1516A - Tit for Tat |
622. Design Circular Queue | 814. Binary Tree Pruning |
791. Custom Sort String | 787. Cheapest Flights Within K Stops |
779. K-th Symbol in Grammar | 701. Insert into a Binary Search Tree |
429. N-ary Tree Level Order Traversal | 739. Daily Temperatures |
647. Palindromic Substrings | 583. Delete Operation for Two Strings |
518. Coin Change 2 | 516. Longest Palindromic Subsequence |
468. Validate IP Address | 450. Delete Node in a BST |